#
# Main makefile
#



CROSS		= powerpc-gekko-

export CC		:=	$(CROSS)gcc
export CXX		:=	$(CROSS)g++
export AR		:=	$(CROSS)ar
export OBJCOPY	:=	$(CROSS)objcopy
export AS		:=	$(CROSS)as
export LD		:=	$(CXX)
CFLAGS_LOCAL=
DOLTOOL=doltool





# Configuration
CFLAGS =	-Wall $(CFLAGS_LOCAL) -I. -Ilwip/include \
			-Iinclude -Ilwip/arch/gc/include -I./lwip/include/ipv4  -Os -fno-exceptions -nostdinc

AFLAGS	=	-Iinclude
LDFLAGS =	 -nostdlib

#-DLWIP_DEBUG -O2 
#-Werror

# Files
MAIN_OBJS = \
	main.o

IO_OBJS = \
	io/video.o io/console.o io/console_font.o io/vsprintf.o \
	io/exi.o io/dvd.o  io/network.o io/sram.o io/pad.o

IPL_OBJS = \
	ipl/ipl.o

LOWLEVEL_OBJS = \
	lowlevel/cache.o lowlevel/exception.o lowlevel/exceptionc.o \
	lowlevel/irq.o lowlevel/string_asm.o lowlevel/string.o \
	lowlevel/ctype.o lowlevel/time.o

LOAD_OBJS = \
	load/elf.o load/dol.o load/dolup.o

DISK_OBJS = \
	 dvd/asmappload.o dvd/anaconda.o dvd/GC_Dvd.o

LWIP_OBJS = \
	lwip/core/tcp_in.o \
	lwip/core/inet.o lwip/core/mem.o lwip/core/memp.o \
	lwip/core/netif.o lwip/core/pbuf.o lwip/core/raw.o  lwip/core/stats.o \
	lwip/core/sys.o lwip/core/tcp.o lwip/core/ipv4/ip_addr.o \
	lwip/core/ipv4/icmp.o lwip/core/ipv4/ip.o lwip/core/ipv4/ip_frag.o \
	lwip/core/tcp_out.o lwip/core/udp.o lwip/netif/etharp.o \
	./lwip/arch/gc/lib.o   ./lwip/arch/gc/netif/gcif.o \
	./lwip/arch/gc/lib_arch.o \

#lwip/core/dhcp.o 

HTTPD_OBJS = \
	httpd/vfs.o httpd/httpd.o
	
MENU_OBJS = menu/menu.o menu/draw.o

LIBRARIES =
# gdbstub/libgdbstub.a

# ./lwip/core/dhcp.o 

OBJS = lowlevel/crt0.o $(MAIN_OBJS) $(IPL_OBJS) $(IO_OBJS) $(LOWLEVEL_OBJS) \
	$(DISK_OBJS) $(LOAD_OBJS) $(LWIP_OBJS) $(HTTPD_OBJS) $(MENU_OBJS) $(LIBRARIES)

# Build rules
all: main.dol main_boot.bin

clean:
	rm -rf $(OBJS)
	
realclean:
	find -name '*.o' | xargs -r rm
	find -name '*.a' | xargs -r rm
	find -name '*~' | xargs -r rm
	find -name '*.bin' | xargs -r rm
	find -name '*.dol' | xargs -r rm
	find -name '*.elf' | xargs -r rm
	find -name '*.map' | xargs -r rm
	find -name '*.tmp' | xargs -r rm


.c.o:
	$(CC) $(CFLAGS)  -c -o $@ $*.c

.cpp.o:
	$(CXX) $(CFLAGS) -c -o $@ $*.cpp

.s.o:
	$(CC) $(AFLAGS) -c -o $@ $*.s

.S.o:
	$(CC) $(AFLAGS) -c -o $@ $*.S

#main.dol: dolhdr main.bin 
#	cat dolhdr main.bin > $@

psoload: main.dol
	$(PSOLOAD) $(PSOLOAD_ARGS) main.dol

main.dol: main.elf
	$(DOLTOOL) -d main.elf

main.bin: main.elf
	$(OBJCOPY) -O binary $< $@

main_boot.bin: main_boot.elf
	$(OBJCOPY) -O binary $< $@

main.elf: $(OBJS)
	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Ttext=0x80D00000 $(OBJS) -Wl,-Map -Wl,main.map
#	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Ttext=0x81300000 $(OBJS) -Wl,-Map -Wl,main.map
	$(CC) $(LDFLAGS) -Wl,-n -o main_high.elf -Wl,-Ttext=0x81300000 $(OBJS) -Wl,-Map -Wl,main_high.map

main_boot.elf: $(OBJS)
	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Tboot.lds $(OBJS) -Wl,-Map -Wl,main_boot.map


gdbstub/libgdbstub.a:
	$(MAKE) -C gdbstub

# TODO: dependencies
